#ifndef STORAGEMANAGER_H
#define STORAGEMANAGER_H

#include <fstream>
#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <memory>
#include <functional>
#include <experimental/filesystem>
#include <cstdlib>
#include <utility>
#include "public.h"
#include "json/json.h"
#include "public.h"

//参考ZLM
class File {
public:
    //判断是否为目录  [AUTO-TRANSLATED:639e15fa]
    //Determine if it is a directory
    static bool is_dir(const std::string &path);

    //判断是否是特殊目录（. or ..）  [AUTO-TRANSLATED:f61f7e33]
    //Determine if it is a special directory (. or ..)
    static bool is_special_dir(const std::string &path);

    //判断文件是否存在  [AUTO-TRANSLATED:edf3cf49]
    //Determine if a file exists
    static bool fileExist(const std::string &path);

    /**
     * 保存内容至文件
     * @param data 文件内容
     * @param path 保存的文件路径
     * @return 是否保存成功
     * Save content to file
     * @param data The file content
     * @param path The path to save the file
     * @return Whether the save was successful

     * [AUTO-TRANSLATED:a919ad75]
     */
    static bool saveFile(const std::string &data, const std::string &path);

    /**
     * 获取父文件夹
     * @param path 路径
     * @return 文件夹
     * Get the parent folder
     * @param path The path
     * @return The folder

     * [AUTO-TRANSLATED:3a584db5]
     */
    static std::string parentDir(const std::string &path);

    /**
     * 遍历文件夹下的所有文件
     * @param path 文件夹路径
     * @param cb 回调对象 ，path为绝对路径，isDir为该路径是否为文件夹，返回true代表继续扫描，否则中断
     * @param enter_subdirectory 是否进入子目录扫描
     * @param show_hidden_file 是否显示隐藏的文件
     * Traverse all files under the folder
     * @param path Folder path
     * @param cb Callback object, path is the absolute path, isDir indicates whether the path is a folder, returns true to continue scanning, otherwise stops
     * @param enter_subdirectory Whether to enter subdirectory scanning
     * @param show_hidden_file Whether to display hidden files

     * [AUTO-TRANSLATED:e97ab081]
     */
    static void scanDir(const std::string &path, const std::function<bool(const std::string &path, bool isDir)> &cb,
                        bool enter_subdirectory = false, bool show_hidden_file = false);


private:
    File();
    ~File();
};


class StorageManager
{
public:
    StorageManager();
    ~StorageManager();

    //对象单例
    static StorageManager *getInstacne();

    //初始化参数
    void initStorageParam(const std::string &recordDir, int maxCache, int maxDays, int delMode, int delCount, int delSize);

    //获取根目录所有文件
    void collectAllRecordFile();
    //计算所有文件大小 字节
    uint64_t getFileTotalSize();
    //计算时间跨度 秒
    uint64_t getFileMaxDuration();

    //新增文件
    void addOneFile(const STU_FILEINFO &info);
    //删除文件
    void delOneFile(const std::string &filePath);

    //根据策略自动覆盖删除
    void checkAndAutoDelete();

private:
    //录制文件根路径
    std::string m_storageRootDir;
    //最大缓存大小 单位M
    uint m_maxCache = 10240;
    //最大缓存天数
    int m_maxDay = 7;
    //文件自动删除策略 0删除固定个数 1删除固定大小
    int m_autoDeleteMode = 1;
    //删除固定个数
    int m_autoDeleteCount = 3;
    //删除固定大小 单位M
    int m_autoDeleteSize = 300;

    //所有文件记录 创建时间戳+文件信息
    multimap<uint64_t, STU_FILEINFO> m_mapRecordFiles;
};

#endif // STORAGEMANAGER_H
